


#ifndef CATDOORS_H
#define CATDOORS_H



#include "category.h"
#include "door.h"



class CatDoor : public CatCollection
{
public:    
    static Category *createCategory( Subject *subj );
    virtual bool empty( Subject *owner = NULL );
    virtual bool one( Subject *owner = NULL );
    virtual uint8_t getCount( Subject *owner = NULL );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatDoor();
    CatDoor( Subject *door );
};



class CatThisDoor : public CatDoor
{
public:    
    static Category *createCategory();
    virtual const CollectionSubjects &getSubjects( Subject *subj = NULL );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatThisDoor();
};



class CatColorDoors : public CatColor
{
public:
    static Category *createCategory( CollectionSubjects &subjs, Color::eColor col, Color::eColor max_col );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatColorDoors( CollectionSubjects &subjs, Color::eColor col );
};



class CatEvenDoors : public CatCollection
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );

protected:
    CatEvenDoors(){}
    CatEvenDoors( CollectionSubjects &subjs );
};



class CatOddDoors : public CatEvenDoors
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    
protected:
    CatOddDoors( CollectionSubjects &subjs );
};



class CatAllDoors : public CatAll
{
public:
    static Category *createCategory( CollectionSubjects &subjs );    
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatAllDoors( CollectionSubjects &subjs );
};



class CatTrapDoors : public CatMutable
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatTrapDoors( CollectionSubjects &subjs );
    virtual void refill();
};



class CatSafeDoors : public CatMutable
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatSafeDoors( CollectionSubjects &subjs );
    virtual void refill();
};



class CatTruthDoors : public CatTruth
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatTruthDoors( CollectionSubjects &subjs );
};



class CatLyingDoors : public CatLying
{
public:
    static Category *createCategory( CollectionSubjects &subjs );
    virtual void generate( CollectionSubjects &subs, Subject *owner, uint8_t level );
    
protected:
    CatLyingDoors( CollectionSubjects &subjs );
};



#endif
